#include <stdio.h>
#include <string.h>
/*
字符串
    在C语言中没有字符串类型

    要使用字符串 需要用到 char 数组
    用char类型的数组是创建了N多个格子 ，然后我们需要向着个格子填充字符

字符串末尾如何知道
    在系统中规定， 字符串 以 ascii 码中 的 0 为结尾
    ascii 码中 的 0  -->>  '\0'

在文件中 通过 EOF 知道文件末尾
    


知道末尾
    字符串求长度            my_strlen
    
    字符串 查 字符          my_strchar

    字符串 查 子串          my_strstr   用的最笨的方式
    
    字符串 对比 字符串      my_strcmp

    字符串 赋值             my_strcpy

    字符串 连接             my_strcat
    
*/

int my_strlen(char *s1)
{
    //判断是否为空指针
    if(s1 == NULL)
    {
        printf("传入的指针不对\n");
        return -1;
    }
    //设置字符串长度变量
    int len = 0;
    //循环遍历字符串求长度
    for (size_t i = 0; s1[i]!='\0'; i++)
    {
        len++;
    }

    return len;
    
}

char * my_strchar(char * s1 , char ch)
{
    //判断是否为空指针
    if(s1 == NULL)
    {
        printf("传入的指针不对\n");
        return NULL;
    }
    //循环遍历s1
    for (size_t i = 0; s1[i] != '\0'; i++)
    {
        //找到了就返回
        if (ch == s1[i])
        {
            return &s1[i];
        }
    }
    //没找到返回NULL
    return NULL;
    
}

char * my_strstr(char * s1 , char * s2)
{
    //判断是否为空指针
    if(s1 == NULL || s2 == NULL)
    {   
        printf("传入的指针不对\n");
        return NULL;
    }
    //先循环遍历s1
    for (size_t i = 0; s1[i]!='\0'; i++)
    {
        //如果匹配到了两个字符串的首元素相同，则进入内部循环
        if(s1[i]==s2[0])
        {
            //循环遍历s2
            for (size_t j = 1; j<=my_strlen(s2); j++)
            {
                //如果循环到结尾没有退出则匹配成功
                if ('\0' == s2[j])
                {
                    return &s1[i];
                }
                //如果两字符串的值不相等，则退出
                if(s1[i + j] != s2[j])
                {
                    break;
                }
                
            }
            
        }
        
    }
    //如果没有首元素相同，则返回NULL
    return NULL;
    
}

char my_strcmp(char * s1 , char *s2)
{
    //判断是否为空指针
    if(NULL == s1 || NULL == s2)
    {
        printf("传入的指针不对\n");
        return -1;
    }
    
    //判断字符串长度是否相等
    if(my_strlen(s1) != my_strlen(s2))
    {
        return -1;
    }
    //判断字符串值是否相同
    for (size_t i = 0; s1[i]!='\0'; i++)
    {
        if(s1[i]!=s2[i])
        {
            return s1[i] - s2[i];
        }
    }

    return 0;
}

char * my_strcpy(char * s1  , char * s2)
{
    //判断指针是否为空值
    if(NULL == s1 || NULL == s2)
    {
        printf("传入的指针不对\n");
        return NULL;
    }
    //循环将s2存储的值复制到s1上
    for (size_t i = 0; s2[i]!='\0'; i++)
    {
        s1[i]=s2[i];

    }
    //将s1字符串末尾补零
    s1[my_strlen(s2)] = '\0';
    
    return s1;
}

char * my_strcat(char * s1 , char * s2)
{
    //判断指针是否为空值
    if(NULL == s1 || NULL == s2)
    {
        printf("传入的指针不对\n");
        return NULL;
    }
    //找到s1的末尾和s2的头部,循环将s2的值赋给s1
    for (size_t i = 0 , j = my_strlen(s1) ; i < my_strlen(s2) ;  i++ , j++)
    {
        s1[j] = s2[i];
    }

    return s1;

    
}

int main(int argc, char const *argv[])
{
    char buf[128] = "helloprintf";
    char buf_cmp[128] = "print";


    //字符串长度
    printf("buf长度为:%d\n",my_strlen(buf));

    //字符查找
    char * p = my_strchar(buf , 'p');
    printf("字符 找到了 : %s\n" , p);

    //字符串查找
    char * p1 = my_strstr(buf ,buf_cmp);
    printf("字符 找到了 : %s\n" , p1);

    //字符串比较
    char ret = my_strcmp(buf , buf_cmp);
    if(0 == ret)
    {
        printf("字符串相同\n");
    }
    else{
        printf("字符串不相同\n");
    }

    // 字符串 拷贝
    printf("buf =  %s\n" , my_strcpy(buf, "哎呦"));

    // 字符串 连接
    printf("buf + ,不错哦 = %s\n" , my_strcat(buf, ",不错哦"));

    return 0;
}
